CSE-221710304057-T.Snithika Patel

In [1]:
!wget --no-check-certificate \
    https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
    -O /tmp/cats_and_dogs_filtered.zip
--2020-07-13 11:13:18--  https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip
Resolving storage.googleapis.com (storage.googleapis.com)... 173.194.214.128, 173.194.215.128, 173.194.216.128, ...
Connecting to storage.googleapis.com (storage.googleapis.com)|173.194.214.128|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 68606236 (65M) [application/zip]
Saving to: ‘/tmp/cats_and_dogs_filtered.zip’

/tmp/cats_and_dogs_ 100%[===================>]  65.43M   110MB/s    in 0.6s    

2020-07-13 11:13:19 (110 MB/s) - ‘/tmp/cats_and_dogs_filtered.zip’ saved [68606236/68606236]

In [2]:
import os
import zipfile
local_zip='/tmp/cats_and_dogs_filtered.zip'
zip_ref=zipfile.ZipFile(local_zip,'r')
zip_ref.extractall('/tmp')
zip_ref.close()
In [3]:
os.listdir('/tmp/cats_and_dogs_filtered')
Out[3]:
['train', 'vectorize.py', 'validation']
In [4]:
os.listdir('/tmp/cats_and_dogs_filtered/train')
Out[4]:
['dogs', 'cats']
In [5]:
print(len(os.listdir('/tmp/cats_and_dogs_filtered/train/dogs')))
print(len(os.listdir('/tmp/cats_and_dogs_filtered/train/cats')))
1000
1000
In [6]:
base_dir='/tmp/cats_and_dogs_filtered'
train_dir=os.path.join(base_dir,'train')
validation_dir=os.path.join(base_dir,'validation')

train_dogs_dir=os.path.join(train_dir,'dogs')
train_cats_dir=os.path.join(train_dir,'cats')

val_dogs_dir=os.path.join(validation_dir,'dogs')
val_cats_dir=os.path.join(validation_dir,'cats')
In [7]:
train_cats_filenames=os.listdir(train_cats_dir)
train_cats_filenames[:4]
Out[7]:
['cat.955.jpg', 'cat.776.jpg', 'cat.914.jpg', 'cat.467.jpg']
In [8]:
import matplotlib.pyplot as plt
%matplotlib inline
In [9]:
plt.imshow(plt.imread(os.path.join(train_cats_dir,train_cats_filenames[0])))
Out[9]:
<matplotlib.image.AxesImage at 0x7f9ef4431be0>
In [10]:
import random
In [11]:
images=[]
plt.figure(figsize=(16,16))
for i in range(16):
  plt.subplot(4,4,i+1)
  imgname=random.choice(train_cats_filenames)
  images.append(imgname)
  img=plt.imread(os.path.join(train_cats_dir,imgname))
  plt.imshow(img)
  plt.title(img.shape)
In [12]:
plt.figure(figsize=(16,16))
j=1
for i in images:
  img=plt.imread(os.path.join(train_cats_dir,i))
  plt.subplot(4,4,j)
  plt.hist(img.flat)
  j+=1
In [13]:
train_dogs_filenames=os.listdir(train_dogs_dir)
train_dogs_filenames[:4]
Out[13]:
['dog.119.jpg', 'dog.723.jpg', 'dog.1.jpg', 'dog.638.jpg']
In [14]:
dogs_images=[]
plt.figure(figsize=(16,16))
for i in range(16):
  plt.subplot(4,4,i+1)
  imgname=random.choice(train_dogs_filenames)
  dogs_images.append(imgname)
  img=plt.imread(os.path.join(train_dogs_dir,imgname))
  plt.imshow(img)
  plt.title(img.shape)
In [15]:
plt.figure(figsize=(16,16))
j=1
for i in dogs_images:
  img=plt.imread(os.path.join(train_dogs_dir,i))
  plt.subplot(4,4,j)
  plt.hist(img.flat)
  j+=1
In [16]:
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(train_dir,target_size=(150, 150),batch_size=20,class_mode='binary')

validation_generator = val_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
In [17]:
img,labels=train_generator.next()
print(img.shape)
print(labels.shape)
(20, 150, 150, 3)
(20,)
In [18]:
plt.figure(figsize=(16,16))
for i in range(20):
  plt.subplot(4,5,i+1)
  plt.imshow(img[i,:,:,:])
  plt.title(labels[i])
  plt.axis("off")
In [19]:
## import required methods
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,Dense,Flatten,MaxPooling2D
In [20]:
model = Sequential()
## add a conv layer followed by maxpooling
model.add(Conv2D(16,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model.add(Conv2D(32,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
# Convert the featuremap into 1D  array
model.add(Flatten())
# Fully connected layer with 512 neurons
model.add(Dense(512,activation='relu'))
## Final output layer
model.add(Dense(1,activation='sigmoid'))

#let us see the summary
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 148, 148, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 18496)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9470464   
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 513       
=================================================================
Total params: 9,494,561
Trainable params: 9,494,561
Non-trainable params: 0
_________________________________________________________________
In [21]:
### Compiling the model
import tensorflow as tf

model.compile(loss=tf.keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
In [22]:
history=model.fit(train_generator,epochs=15,validation_data=validation_generator,batch_size=32)
Epoch 1/15
100/100 [==============================] - 62s 623ms/step - loss: 0.7712 - accuracy: 0.5720 - val_loss: 0.6391 - val_accuracy: 0.6360
Epoch 2/15
100/100 [==============================] - 62s 622ms/step - loss: 0.6039 - accuracy: 0.6685 - val_loss: 0.5938 - val_accuracy: 0.7060
Epoch 3/15
100/100 [==============================] - 62s 622ms/step - loss: 0.5243 - accuracy: 0.7480 - val_loss: 0.6070 - val_accuracy: 0.6790
Epoch 4/15
100/100 [==============================] - 62s 616ms/step - loss: 0.4657 - accuracy: 0.7750 - val_loss: 0.5673 - val_accuracy: 0.7310
Epoch 5/15
100/100 [==============================] - 62s 617ms/step - loss: 0.4021 - accuracy: 0.8200 - val_loss: 0.6523 - val_accuracy: 0.6770
Epoch 6/15
100/100 [==============================] - 62s 616ms/step - loss: 0.3080 - accuracy: 0.8630 - val_loss: 0.6832 - val_accuracy: 0.7190
Epoch 7/15
100/100 [==============================] - 62s 616ms/step - loss: 0.2293 - accuracy: 0.9015 - val_loss: 0.6835 - val_accuracy: 0.7160
Epoch 8/15
100/100 [==============================] - 62s 617ms/step - loss: 0.1640 - accuracy: 0.9400 - val_loss: 0.8087 - val_accuracy: 0.7230
Epoch 9/15
100/100 [==============================] - 61s 614ms/step - loss: 0.1123 - accuracy: 0.9620 - val_loss: 1.1723 - val_accuracy: 0.6820
Epoch 10/15
100/100 [==============================] - 62s 615ms/step - loss: 0.0896 - accuracy: 0.9675 - val_loss: 1.1388 - val_accuracy: 0.7090
Epoch 11/15
100/100 [==============================] - 61s 615ms/step - loss: 0.0607 - accuracy: 0.9830 - val_loss: 1.1382 - val_accuracy: 0.7230
Epoch 12/15
100/100 [==============================] - 62s 616ms/step - loss: 0.0474 - accuracy: 0.9860 - val_loss: 1.7736 - val_accuracy: 0.6850
Epoch 13/15
100/100 [==============================] - 62s 617ms/step - loss: 0.0394 - accuracy: 0.9895 - val_loss: 2.3485 - val_accuracy: 0.6610
Epoch 14/15
100/100 [==============================] - 62s 617ms/step - loss: 0.0398 - accuracy: 0.9885 - val_loss: 2.0040 - val_accuracy: 0.7060
Epoch 15/15
100/100 [==============================] - 62s 617ms/step - loss: 0.0424 - accuracy: 0.9880 - val_loss: 2.1117 - val_accuracy: 0.7190
In [23]:
train_acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
train_loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = list(range(1,16))
plt.figure(figsize=(16,4))
plt.subplot(1,2,1)
plt.plot(epochs,train_acc,label='train_acc')
plt.plot(epochs,val_acc,label='val_acc')
plt.title('accuracy')
plt.legend()
plt.subplot(1,2,2)
plt.plot(epochs,train_loss,label='train_loss')
plt.plot(epochs,val_loss,label='val_loss')
plt.title('loss')
plt.legend()
Out[23]:
<matplotlib.legend.Legend at 0x7f9ea68f2780>

With another model

In [24]:
model1 = Sequential()
## add a conv layer followed by maxpooling
model1.add(Conv2D(128,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(32,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
# Convert the featuremap into 1D  array
model1.add(Flatten())
# Fully connected layer with 512 neurons
model1.add(Dense(512,activation='relu'))
## Final output layer
model1.add(Dense(1,activation='softmax'))

#let us see the summary
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 148, 148, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 18496)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9470464   
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 513       
=================================================================
Total params: 9,494,561
Trainable params: 9,494,561
Non-trainable params: 0
_________________________________________________________________
In [25]:
model1.compile(loss=tf.keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
In [26]:
history1=model.fit(train_generator,epochs=7,validation_data=validation_generator,batch_size=32)
Epoch 1/7
100/100 [==============================] - 62s 619ms/step - loss: 0.0485 - accuracy: 0.9880 - val_loss: 1.9052 - val_accuracy: 0.7190
Epoch 2/7
100/100 [==============================] - 62s 618ms/step - loss: 0.0211 - accuracy: 0.9935 - val_loss: 2.0670 - val_accuracy: 0.7110
Epoch 3/7
100/100 [==============================] - 62s 619ms/step - loss: 0.0414 - accuracy: 0.9935 - val_loss: 1.8772 - val_accuracy: 0.6990
Epoch 4/7
100/100 [==============================] - 62s 615ms/step - loss: 0.0092 - accuracy: 0.9975 - val_loss: 2.2092 - val_accuracy: 0.7340
Epoch 5/7
100/100 [==============================] - 61s 615ms/step - loss: 0.0245 - accuracy: 0.9910 - val_loss: 2.1517 - val_accuracy: 0.7030
Epoch 6/7
100/100 [==============================] - 62s 615ms/step - loss: 0.0205 - accuracy: 0.9910 - val_loss: 2.3657 - val_accuracy: 0.7280
Epoch 7/7
100/100 [==============================] - 62s 617ms/step - loss: 0.0544 - accuracy: 0.9945 - val_loss: 2.1724 - val_accuracy: 0.7320
In [27]:
train_acc = history1.history['accuracy']
val_acc = history1.history['val_accuracy']
train_loss = history1.history['loss']
val_loss = history1.history['val_loss']
epochs = list(range(1,8))
plt.figure(figsize=(16,4))
plt.subplot(1,2,1)
plt.plot(epochs,train_acc,label='train_acc')
plt.plot(epochs,val_acc,label='val_acc')
plt.title('accuracy')
plt.legend()
plt.subplot(1,2,2)
plt.plot(epochs,train_loss,label='train_loss')
plt.plot(epochs,val_loss,label='val_loss')
plt.title('loss')
plt.legend()
Out[27]:
<matplotlib.legend.Legend at 0x7f9ea6a2c5c0>

2nd model has overfitting issue and 1st model has underfitting issue

In [ ]: